package classfile

/*
	字段表
*/
type FieldInfo struct {
	MemberInfo
}

/*
	方法表
*/
type MethodInfo struct {
	MemberInfo
}

/*
	字段表 或 方法表 的结构体： 因为jvm的 字段表 和 方法表 的结构几乎一样。
*/
type MemberInfo struct {
	cp              ConstantPool // 常量池指针（常量池索引）；在字节码文件中并不存在，这里就是为了方便操作而添加的
	accessFlags     uint16
	nameIndex       uint16
	descriptorIndex uint16
	attributes      []AttributeInfo
}

func readMembers(reader *ClassReader, cp ConstantPool) []*MemberInfo {
	memberCount := reader.readUint16() //读取 字段 或 方法 的数量
	members := make([]*MemberInfo, memberCount)
	for i := range members {
		members[i] = readMember(reader, cp)
	}
	return members
}

func readMember(reader *ClassReader, cp ConstantPool) *MemberInfo {
	return &MemberInfo{
		cp:              cp,
		accessFlags:     reader.readUint16(),        // 常量池引用
		nameIndex:       reader.readUint16(),        // 常量池引用
		descriptorIndex: reader.readUint16(),        // 常量池引用
		attributes:      readAttributes(reader, cp), // 属性表
	}
}

// getter
func (self *MemberInfo) AccessFlags() uint16 {
	return self.accessFlags
}

func (self *MemberInfo) Name() string {
	return self.cp.getUtf8(self.nameIndex)
}

func (self *MemberInfo) Descriptor() string {
	return self.cp.getUtf8(self.descriptorIndex)
}
